package com.easycoding.framework.dao.hibernate;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; 
import org.springframework.orm.hibernate3.support.HibernateDaoSupport; 


public abstract class HibernateBaseDao<T,PK extends Serializable> extends HibernateDaoSupport implements IAbstractDao<T,PK>{
	protected final Log logger = LogFactory.getLog(getClass());
    
    public void insert(final T t) {
        this.getHibernateTemplate().save(t);
    }

    /**
     * 批量添加记录
     * @param ts
     */
    public void insertBatch(final T[] ts){
        for(T t:ts){
            this.insert(t);
        }
    }


    public void delete(final T t) {
        this.getHibernateTemplate().delete(t);
    }

    public void update(final T t) {
        this.getHibernateTemplate().update(t);
    }
    
    @SuppressWarnings("unchecked")
    public List<T> findAll() {
        return (List<T>) getHibernateTemplate().find("from " + getTClass().getName());
    }

    public T load(PK id) {
        return (T) getHibernateTemplate().load(getTClass(),id);
    }

    public T get(PK id) {
        return (T) getHibernateTemplate().get(getTClass(),id);
    }
    /**
     * 根据类名和id删除记录
     * @param getTClass() 类名
     * @param pk 主键
     */
    public void delete (PK pk){
        T entity=load(pk);
        delete(entity);
    }


    /**
     * 批量删除
     * @param pks 主键
     * @param getTClass() 实体类型
     */
    public void deleteBatch(PK[] pks){
        for(PK pk:pks){
            this.delete(pk);
        }
    }


    /**
     * 批量删除
     * @param t
     */
    public void deleteBatch(T[] ts){
        for(T t:ts){
            this.delete(t);
        }
    }


    /**
     * 清空缓存一级缓存数据
     * @param getTClass()
     */
    public void evict(T t){
        this.getHibernateTemplate().evict(t);
    }


    /**
     * 清除二级缓存中的某条数据
     * @param getTClass() 被清除数据的类
     * @param k 主键
     */
    @SuppressWarnings("deprecation")
	public void evictFromFactory(PK k){
        this.getSessionFactory().evict(getTClass(),k);
    }


    /**
     * 清除某个类所有实例的二级缓存
     * @param getTClass() 被清除的类
     */
    @SuppressWarnings("deprecation")
	public void evict(){
        this.getSessionFactory().evict(getTClass());
    }


    /**
     * 
     * 向数据库提交sql语句
     */
    public void flush(){
    	this.getHibernateTemplate().flush();
    }
    /**     
     * 清空缓存一级缓存数据
     */
	public void clear(){
		this.getHibernateTemplate().clear();
	}
    /**
     * 由Hibernate判断是否添加还是更新
     * @param t
     */
    public void saveOrUpdate(T t){
        getHibernateTemplate().saveOrUpdate(t);
    }
   
	@SuppressWarnings("unchecked")
	private Class<T> getTClass(){
		return (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
	}
}

